// 2018版权所有etcd作者
// 
// 根据Apache许可证2.0版（以下简称“许可证”）获得许可；
// 除非遵守许可证，否则不得使用此文件。
// 您可以通过
// 
// www.apache.org/licenses/LICENSE-2.0 
// 
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，
// 无任何明示或暗示的保证或条件。
// 请参阅许可证，了解管理许可的特定语言和
// 许可证下的限制。

package flags

import (
	"flag"
	"fmt"
	"sort"
	"strings"
)

// StringsValue包装“sort.StringSlice”。
type StringsValue sort.StringSlice

// Set解析命令行字符串集，用逗号分隔。
// 实现“flag.Value”接口。
func (ss *StringsValue) Set(s string) error {
	*ss = strings.Split(s, ",")
	return nil
}

// 字符串实现“flag.Value”接口。
func (ss *StringsValue) String() string { return strings.Join(*ss, ",") }

// NewStringsValue将字符串切片实现为“flag.Value”接口。
// 给定值用逗号分隔。
func NewStringsValue(s string) (ss *StringsValue) {
	if s == "" {
		return &StringsValue{}
	}
	ss = new(StringsValue)
	if err := ss.Set(s); err != nil {
		panic(fmt.Sprintf("new StringsValue should never fail: %v", err))
	}
	return ss
}

// StringsFromFlag从标志返回一个字符串片段。
func StringsFromFlag(fs *flag.FlagSet, flagName string) []string {
	return []string(*fs.Lookup(flagName).Value.(*StringsValue))
}
